#include <iostream>
#include <math.h>
#include <vector>
#include <algorithm>

using namespace std;
//求除1和本身的约数
void DivNum(int n, vector<int>& div)  
{
    for(int i = 2; i <= sqrt(n); ++i){
        if(n % i == 0){
            div.push_back(i);
            if(n / i != i)  //如果不是平方数，将其另一个约数放入
                div.push_back(n / i);
        }
    }
}

int JumpStep(int n, int m)
{
    vector<int> step (m+1, 0);  //存放N石板到每个节点的最少步数
    step[n] = 1;   //当前位置N初始化
    for(int i = n; i < m; ++i){
        if(step[i] == 0)  //0表示无法到达
            continue;
        
        vector<int> div;
        DivNum(i, div);
        
        for(int j = 0; j < div.size(); ++j){
            if(div[j]+i <= m && step[div[j]+i] != 0)  
                //step[div[j]+i]不为0 说明石板前面已经到达过，
                // 比较当前步数到达和原有步数，更新为最小值
                step[div[j]+i] = min(step[div[j]+i], step[i]+1);
            
            else if(div[j]+i <= m)  
                //step[j]== 0 说明石板没到过，更新步数（并不是最小步数）
                step[div[j]+i] = step[i]+1;   
        }
    }
    
    return step[m] - 1;
}

int main()
{
    int N, M;
    cin >> N >> M;
    cout << JumpStep(N, M);
    return 0;
}
